﻿using IM.Easy.Core.Extensions;
using IM.Easy.Core.ServiceLifetime;
using IM.Easy.Entity.System;
using IM.Easy.SystemServices.Dtos;
using IM.Easy.SystemServices.IServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Nodes;
using System.Threading.Tasks;

namespace IM.Easy.SystemServices.Services
{
    /// <summary>
    /// 路由服务
    /// </summary>
    public class VueRouteService : IVueRouteService, ISingleton
    {
        /// <summary>
        /// 通过菜单生成路由信息
        /// </summary>
        /// <param name="menus">菜单列表</param>
        /// <returns>路由信息列表</returns>
        public List<VueRoute> GenerateRoute(List<SysMenu> menus, bool useLayout = true)
        {
            // 初始化路由列表
            List<VueRoute> routes = [];

            // 遍历菜单，生成对应的路由信息
            foreach (var menu in menus)
            {
                if (menu.MenuType == MenuType.Button) continue;
                // 生成一个 VueRoute
                VueRoute route = new()
                {
                    Id = menu.Id,
                    Path = NormalizePath(menu),          // 路由路径
                    Name = GetRouteName(menu),          // 路由名称
                    Component = menu.Component,// 对应的组件
                    Hidden = !menu.Visible,
                    //RequiresAuth = menu.RequiresAuth, // 是否需要身份验证
                    Meta = new JsonObject
                    {
                        ["title"] = menu.Name,
                        ["icon"] = menu.Icon,
                        ["order"] = menu.Order,
                        ["id"] = menu.Id,
                    }
                };

                //如果菜单自身是菜单且不存在子菜单
                if (menu.MenuType == MenuType.Menu && !HasChildrenMenu(menu) && useLayout)
                {
                    route.Component = "Layout";
                    route.IsVirtual = true;
                    route.Path = string.Empty;
                    var children = new VueRoute
                    {
                        Id = menu.Id,
                        Path = menu.Path,          // 路由路径
                        Name = GetRouteName(menu),          // 路由名称
                        Component = menu.Component,// 对应的组件
                        Hidden = !menu.Visible,
                        //RequiresAuth = menu.RequiresAuth, // 是否需要身份验证
                        Meta = new JsonObject
                        {
                            ["title"] = menu.Name,
                            ["icon"] = menu.Icon,
                            ["order"] = menu.Order,
                            ["id"] = menu.Id,
                        }
                    };
                    route.Children = [children];
                }

                // 如果菜单有子菜单，递归生成子路由
                if (HasChildrenMenu(menu))
                {
                    route.Component = useLayout ? "Layout" : route.Component;
                    //route.AlwaysShow = true;
                    route.Children = GenerateRoute(menu.Children, false);
                }

                // 添加到路由列表中
                routes.Add(route);
            }

            return routes;
        }

        /// <summary>
        /// 获取路由名称
        /// </summary>
        /// <param name="menu">菜单信息</param>
        /// <returns>路由名称</returns>
        public string GetRouteName(SysMenu menu)
        {
            string routerName = menu.Path.ToLower();
            //// 非外链并且是一级目录（类型为目录）
            //if (IsMeunFrame(menu))
            //{
            //    routerName = string.Empty;
            //}
            return routerName;
        }

        /// <summary>
        /// 判断是否存在子菜单
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public bool HasChildrenMenu(SysMenu menu)
        {
            return menu.Children?.Any(s => s.MenuType == MenuType.Menu) ?? false;
        }

        /// <summary>
        /// 获取标准路径
        /// </summary>
        /// <param name="menu"></param>
        /// <returns></returns>
        public string NormalizePath(SysMenu menu)
        {
            // 如果 Path 为空或 null，设置默认值
            var path = string.IsNullOrWhiteSpace(menu.Path) ? string.Empty : menu.Path;

            if (menu.ParentId == default)
            {
                // 第一层级必须以 / 开头
                return path.StartsWith("/") ? path : $"/{path}";
            }
            else
            {
                // 子菜单不能以 / 开头
                return path.StartsWith("/") ? path.TrimStart('/') : path;
            }
        }
    }

}
